<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <link href="cpip.css" rel="stylesheet" type="text/css" />
    <title>File: /Users/paulross/dev/Python-3.6.2/Objects/dict-common.h</title>
  </head>
  <body>
    <h1>File: /Users/paulross/dev/Python-3.6.2/Objects/dict-common.h</h1>
    <p>Green shading in the line number column
means the source is part of the translation unit, red means it is conditionally excluded.
Highlighted line numbers link to the translation unit page. Highlighted macros link to
the macro page.</p>
    <pre><a name="1" /><span class="True">       1:</span> <span class="f">#</span><span class="n">ifndef</span> <a href="macros_noref.html#_UHlfRElDVF9DT01NT05fSF8w"><span class="b">Py_DICT_COMMON_H</span></a>
<a name="2" /><span class="True">       2:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_noref.html#_UHlfRElDVF9DT01NT05fSF8w"><span class="b">Py_DICT_COMMON_H</span></a>
<a name="3" /><span class="True">       3:</span> 
<a name="4" /><span class="True">       4:</span> <span class="m">typedef</span> <span class="m">struct</span> <span class="f">{</span>
<a name="5" /><span class="True">       5:</span>     <span class="k">/* Cached hash code of me_key. */</span>
<a name="6" /><span class="True">       6:</span>     <span class="b">Py_hash_t</span> <span class="b">me_hash</span><span class="f">;</span>
<a name="7" /><span class="True">       7:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="b">me_key</span><span class="f">;</span>
<a name="8" /><span class="True">       8:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="b">me_value</span><span class="f">;</span> <span class="k">/* This field is only meaningful for combined tables */</span>
<a name="9" /><span class="True">       9:</span> <span class="f">}</span> <span class="b">PyDictKeyEntry</span><span class="f">;</span>
<a name="10" /><span class="True">      10:</span> 
<a name="11" /><span class="True">      11:</span> <span class="k">/* dict_lookup_func() returns index of entry which can be used like DK_ENTRIES(dk)[index].</span>
<a name="12" /><span class="True">      12:</span> <span class="k"> * -1 when no entry found, -3 when compare raises error.</span>
<a name="13" /><span class="True">      13:</span> <span class="k"> */</span>
<a name="14" /><span class="True">      14:</span> <span class="m">typedef</span> <span class="b">Py_ssize_t</span> <span class="f">(</span><span class="f">*</span><span class="b">dict_lookup_func</span><span class="f">)</span>
<a name="15" /><span class="True">      15:</span> <span class="f">(</span><span class="b">PyDictObject</span> <span class="f">*</span><span class="b">mp</span><span class="f">,</span> <span class="b">PyObject</span> <span class="f">*</span><span class="b">key</span><span class="f">,</span> <span class="b">Py_hash_t</span> <span class="b">hash</span><span class="f">,</span> <span class="b">PyObject</span> <span class="f">*</span><span class="f">*</span><span class="f">*</span><span class="b">value_addr</span><span class="f">,</span>
<a name="16" /><span class="True">      16:</span>  <span class="b">Py_ssize_t</span> <span class="f">*</span><span class="b">hashpos</span><span class="f">)</span><span class="f">;</span>
<a name="17" /><span class="True">      17:</span> 
<a name="18" /><span class="True">      18:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_ref.html#_REtJWF9FTVBUWV8w"><span class="b">DKIX_EMPTY</span></a> <span class="f">(</span><span class="f">-</span><span class="c">1</span><span class="f">)</span>
<a name="19" /><span class="True">      19:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_ref.html#_REtJWF9EVU1NWV8w"><span class="b">DKIX_DUMMY</span></a> <span class="f">(</span><span class="f">-</span><span class="c">2</span><span class="f">)</span>  <span class="k">/* Used internally */</span>
<a name="20" /><span class="True">      20:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_ref.html#_REtJWF9FUlJPUl8w"><span class="b">DKIX_ERROR</span></a> <span class="f">(</span><span class="f">-</span><span class="c">3</span><span class="f">)</span>
<a name="21" /><span class="True">      21:</span> 
<a name="22" /><span class="True">      22:</span> <span class="k">/* See dictobject.c for actual layout of DictKeysObject */</span>
<a name="23" /><span class="True">      23:</span> <span class="m">struct</span> <span class="b">_dictkeysobject</span> <span class="f">{</span>
<a name="24" /><span class="True">      24:</span>     <span class="b">Py_ssize_t</span> <span class="b">dk_refcnt</span><span class="f">;</span>
<a name="25" /><span class="True">      25:</span> 
<a name="26" /><span class="True">      26:</span>     <span class="k">/* Size of the hash table (dk_indices). It must be a power of 2. */</span>
<a name="27" /><span class="True">      27:</span>     <span class="b">Py_ssize_t</span> <span class="b">dk_size</span><span class="f">;</span>
<a name="28" /><span class="True">      28:</span> 
<a name="29" /><span class="True">      29:</span>     <span class="k">/* Function to lookup in the hash table (dk_indices):</span>
<a name="30" /><span class="True">      30:</span> <span class="k"></span>
<a name="31" /><span class="True">      31:</span> <span class="k">       - lookdict(): general-purpose, and may return DKIX_ERROR if (and</span>
<a name="32" /><span class="True">      32:</span> <span class="k">         only if) a comparison raises an exception.</span>
<a name="33" /><span class="True">      33:</span> <span class="k"></span>
<a name="34" /><span class="True">      34:</span> <span class="k">       - lookdict_unicode(): specialized to Unicode string keys, comparison of</span>
<a name="35" /><span class="True">      35:</span> <span class="k">         which can never raise an exception; that function can never return</span>
<a name="36" /><span class="True">      36:</span> <span class="k">         DKIX_ERROR.</span>
<a name="37" /><span class="True">      37:</span> <span class="k"></span>
<a name="38" /><span class="True">      38:</span> <span class="k">       - lookdict_unicode_nodummy(): similar to lookdict_unicode() but further</span>
<a name="39" /><span class="True">      39:</span> <span class="k">         specialized for Unicode string keys that cannot be the &lt;dummy&gt; value.</span>
<a name="40" /><span class="True">      40:</span> <span class="k"></span>
<a name="41" /><span class="True">      41:</span> <span class="k">       - lookdict_split(): Version of lookdict() for split tables. */</span>
<a name="42" /><span class="True">      42:</span>     <span class="b">dict_lookup_func</span> <span class="b">dk_lookup</span><span class="f">;</span>
<a name="43" /><span class="True">      43:</span> 
<a name="44" /><span class="True">      44:</span>     <span class="k">/* Number of usable entries in dk_entries. */</span>
<a name="45" /><span class="True">      45:</span>     <span class="b">Py_ssize_t</span> <span class="b">dk_usable</span><span class="f">;</span>
<a name="46" /><span class="True">      46:</span> 
<a name="47" /><span class="True">      47:</span>     <span class="k">/* Number of used entries in dk_entries. */</span>
<a name="48" /><span class="True">      48:</span>     <span class="b">Py_ssize_t</span> <span class="b">dk_nentries</span><span class="f">;</span>
<a name="49" /><span class="True">      49:</span> 
<a name="50" /><span class="True">      50:</span>     <span class="k">/* Actual hash table of dk_size entries. It holds indices in dk_entries,</span>
<a name="51" /><span class="True">      51:</span> <span class="k">       or DKIX_EMPTY(-1) or DKIX_DUMMY(-2).</span>
<a name="52" /><span class="True">      52:</span> <span class="k"></span>
<a name="53" /><span class="True">      53:</span> <span class="k">       Indices must be: 0 &lt;= indice &lt; USABLE_FRACTION(dk_size).</span>
<a name="54" /><span class="True">      54:</span> <span class="k"></span>
<a name="55" /><span class="True">      55:</span> <span class="k">       The size in bytes of an indice depends on dk_size:</span>
<a name="56" /><span class="True">      56:</span> <span class="k"></span>
<a name="57" /><span class="True">      57:</span> <span class="k">       - 1 byte if dk_size &lt;= 0xff (char*)</span>
<a name="58" /><span class="True">      58:</span> <span class="k">       - 2 bytes if dk_size &lt;= 0xffff (int16_t*)</span>
<a name="59" /><span class="True">      59:</span> <span class="k">       - 4 bytes if dk_size &lt;= 0xffffffff (int32_t*)</span>
<a name="60" /><span class="True">      60:</span> <span class="k">       - 8 bytes otherwise (int64_t*)</span>
<a name="61" /><span class="True">      61:</span> <span class="k"></span>
<a name="62" /><span class="True">      62:</span> <span class="k">       Dynamically sized, 8 is minimum. */</span>
<a name="63" /><span class="True">      63:</span>     <span class="m">union</span> <span class="f">{</span>
<a name="64" /><span class="True">      64:</span>         <span class="b">int8_t</span> <span class="b">as_1</span><span class="f">[</span><span class="c">8</span><span class="f">]</span><span class="f">;</span>
<a name="65" /><span class="True">      65:</span>         <span class="b">int16_t</span> <span class="b">as_2</span><span class="f">[</span><span class="c">4</span><span class="f">]</span><span class="f">;</span>
<a name="66" /><span class="True">      66:</span>         <span class="b">int32_t</span> <span class="b">as_4</span><span class="f">[</span><span class="c">2</span><span class="f">]</span><span class="f">;</span>
<a name="67" /><span class="True">      67:</span> <span class="f">#</span><span class="n">if</span> <a href="macros_ref.html#_U0laRU9GX1ZPSURfUF8w"><span class="b">SIZEOF_VOID_P</span></a> <span class="f">&gt;</span> <span class="c">4</span>
<a name="68" /><span class="True">      68:</span>         <span class="b">int64_t</span> <span class="b">as_8</span><span class="f">[</span><span class="c">1</span><span class="f">]</span><span class="f">;</span>
<a name="69" /><span class="True">      69:</span> <span class="f">#</span><span class="n">endif</span>
<a name="70" /><span class="True">      70:</span>     <span class="f">}</span> <span class="b">dk_indices</span><span class="f">;</span>
<a name="71" /><span class="True">      71:</span> 
<a name="72" /><span class="True">      72:</span>     <span class="k">/* &quot;PyDictKeyEntry dk_entries[dk_usable];&quot; array follows:</span>
<a name="73" /><span class="True">      73:</span> <span class="k">       see the DK_ENTRIES() macro */</span>
<a name="74" /><span class="True">      74:</span> <span class="f">}</span><span class="f">;</span>
<a name="75" /><span class="True">      75:</span> 
<a name="76" /><span class="True">      76:</span> <span class="f">#</span><span class="n">endif</span>
<a name="77" /><span class="True">      77:</span> </pre>
  </body>
</html>
